`include "lib/defines.vh"
// WB 模块负责将 MEM 阶段的结果写回到寄存器文件中。
// 具体来说，WB 模块从 MEM 阶段接收一个总线mem_to_wb_bus的信号，该总线包含了 MEM 阶段的计算结果。
// 该总线的宽度为 MEM_TO_WB_WD，MEM_TO_WB_WD的数值为70。
// 然后，WB 模块将该总线解包为 wb_pc、rf_we、rf_waddr 和 rf_wdata 信号。
// WB 模块将 rf_we、rf_waddr 和 rf_wdata 信号打包到 wb_to_rf_bus 信号中，而PC信号直接输出，不传入寄存器文件。
// wb_to_rf_bus 的宽度为 WB_TO_RF_WD，WB_TO_RF_WD的数值为38。

module WB(
    input wire clk,
    input wire rst,
    // input wire flush,
    input wire [`StallBus-1:0] stall,   // 用于控制流水线暂停的总线，代码检查流水线，StallBus的数值为6

    input wire [`MEM_TO_WB_WD-1:0] mem_to_wb_bus,   // 从 MEM 阶段传来的数据总线，MEM_TO_WB_WD的数值为70

    output wire [`WB_TO_RF_WD-1:0] wb_to_rf_bus,    // 传递给 regfile 的数据总线，WB_TO_RF_WD的数值为38

    output  wire [37:0] wb_to_id,

    output wire [31:0] debug_wb_pc,
    output wire [3:0] debug_wb_rf_wen,
    output wire [4:0] debug_wb_rf_wnum,
    output wire [31:0] debug_wb_rf_wdata 
);

    reg [`MEM_TO_WB_WD-1:0] mem_to_wb_bus_r;

    // 该逻辑块负责更新 mem_to_wb_bus_r 寄存器
    // 当复位信号 (rst) 置位时，mem_to_wb_bus_r 寄存器被清零。实现复位功能。
    // 当 MEM 阶段暂停时，mem_to_wb_bus_r 寄存器被清零。      实现流水线暂停功能。
    // 当 MEM 阶段不暂停时，mem_to_wb_bus_r 寄存器被更新。    实现正常流水线功能。
    always @ (posedge clk) begin
        if (rst) begin
            // 当复位信号 (rst) 置位时，mem_to_wb_bus_r 寄存器被清零。
            // 通过将其赋值为宽度由宏 MEM_TO_WB_WD 定义的零值，MEM_TO_WB_WD为70，确保在复位时寄存器处于已知状态。
            mem_to_wb_bus_r <= `MEM_TO_WB_WD'b0;
        end
        // else if (flush) begin
        //     mem_to_wb_bus_r <= `MEM_TO_WB_WD'b0;
        // end
        else if (stall[4]==`Stop && stall[5]==`NoStop) begin    // Stop是一位1，NoStop是一位0
            mem_to_wb_bus_r <= `MEM_TO_WB_WD'b0;    // 当 MEM 阶段暂停时，mem_to_wb_bus_r 寄存器被清零。
        end
        else if (stall[4]==`NoStop) begin
            mem_to_wb_bus_r <= mem_to_wb_bus;   // 当 MEM 阶段不暂停时，mem_to_wb_bus_r 寄存器被更新。
        end
    end

    
    wire [31:0] wb_pc;      // 程序计数器，32位
    wire rf_we;             // 寄存器文件写使能信号，1位
    wire [4:0] rf_waddr;    // 寄存器文件写地址，5位
    wire [31:0] rf_wdata;   // 寄存器文件写数据，32位
    // 以上共70位，与 MEM_TO_WB_WD 的数值相同
    // 对于mem_to_wb_bus_r，[31,0]是wb_pc，[32]是rf_we，[37,33]是rf_waddr，[69,38]是rf_wdata


    // 使用 assign 语句将 mem_to_wb_bus_r 寄存器中的值解包到这四个信号中。
    // 这意味着 mem_to_wb_bus_r 中存储的值被分配给 wb_pc、rf_we、rf_waddr 和 rf_wdata。
    assign {
        wb_pc,
        rf_we,
        rf_waddr,
        rf_wdata
    } = mem_to_wb_bus_r;

    // 使用 assign 语句将 wb_pc、rf_we、rf_waddr 和 rf_wdata 信号打包到 wb_to_rf_bus 信号中。
    assign wb_to_rf_bus = {
        rf_we,
        rf_waddr,
        rf_wdata
    };
    //wb_to_rf_bus是38位，[0]是rf_we，[5,1]是rf_waddr，[37,6]是rf_wdata,与WB_TO_RF_WD的数值相同

    assign wb_to_id = {
        rf_we,
        rf_waddr,
        rf_wdata
    };

    assign debug_wb_pc = wb_pc;
    assign debug_wb_rf_wen = {4{rf_we}}; // // 将 rf_we 信号重复 4 次，形成 4 位宽的信号
    assign debug_wb_rf_wnum = rf_waddr;
    assign debug_wb_rf_wdata = rf_wdata;

    
endmodule